package com.zkh.myframe.filter;

import java.nio.charset.Charset;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

import com.zkh.myutils.code.Charsets;
import com.zkh.myutils.utils.ArrayUtils;
import com.zkh.myutils.utils.Utils;

/**
 * GET请求重写获取参数方法，用以转换字符编码
 * @author zkh
 */
public class GetRequest extends HttpServletRequestWrapper {
	
	//字符编码
	private Charset charset;
	//原始请求对象
	private HttpServletRequest request;

	/**
	 * 构造方法
	 * @param request 原始请求对象
	 * @param charset 字符编码
	 */
	public GetRequest(HttpServletRequest request,Charset charset) {
		super(request);
		this.request = request;
		this.charset = charset;
	}

	/**
	 * 重写获取单个参数的方法
	 */
	@Override
	public String getParameter(String name) {
		return Utils.convertEncode(request.getParameter(name), Charsets.ISO_8859_1, charset);
	}

	/**
	 * 重写获取所有参数的方法
	 */
	@Override
	public Map<String, String[]> getParameterMap() {
		//获取参数
		Map<String, String[]> map = request.getParameterMap();
		//不为空，则转换编码
		if(map!=null) {
			//遍历键值对，并对值逐个进行转码
			map.forEach((key, value) -> ArrayUtils.map(value, v -> Utils.convertEncode(v, Charsets.ISO_8859_1, charset)));
		}
		//返回转换后的map
		return map;
	}

	/**
	 * 重写获取数组的方法
	 */
	@Override
	public String[] getParameterValues(String name) {
		//获取值，如果值不为空，则进行编码转换
		return ArrayUtils.map(request.getParameterValues(name), v->Utils.convertEncode(v, Charsets.ISO_8859_1, charset));
	}
}
